#include <string>
#include <list>
#include "node.h"
#include "program.h"

namespace AST {

    // Construtor
    Program::Program(std::list<Node*>* declarations) {
        // Configuração
        this->_setDeclarations(declarations);
    }

    // Construtor sem Declarações
    Program::Program() {}

    // Configura as Declarações do Programa
    Program* Program::_setDeclarations(std::list<Node*>* declarations) {
        // Configuração
        this->_declarations = declarations;
        // Encadeamento
        return this;
    };

    // Apresenta as Declarações do Programa
    std::list<Node*>* Program::getDeclarations() {
        // Inicializado?
        if (this->_declarations == NULL) {
            // Declarações Vazias
            this->_setDeclarations(new std::list<Node*>());
        }
        // Apresentação
        return this->_declarations;
    };

    // Sobrescrita
    std::string Program::toString(int indent) {
        // Inicialização
        std::string output = this->getIndentSpaces(indent) + "Program";
        // Declarações
        std::list<Node*> declarations = (*this->getDeclarations());
        // Processamento de Declarações
        for (std::list<Node*>::iterator i = declarations.begin(); i != declarations.end(); i++) {
            output = output + "\n" + (*i)->toString(indent + 1);
        };
        // Apresentação
        return output;
    };

    // Especialização
    std::string Program::toString() {
        return this->toString(0);
    };

};
